package gui

import (
	"fmt"
	"pass-tree/internal/gui/windows"
	"pass-tree/internal/logic/models"
	"pass-tree/pkg/utils"
	"time"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
)

type SearchTableUI struct {
	TableRef   *widget.Table
	DetailsBtn *widget.Button
	CopyBtn    *widget.Button
	EditBtn    *widget.Button
}

var searchTableUI SearchTableUI

// 搜索界面
func (ui *MainWindow) SearchMakeTableUI() {

	w := fyne.CurrentApp().NewWindow("搜索")

	var list []models.Password
	searchInput := widget.NewEntry()
	searchInput.SetPlaceHolder("请输入关键词")

	searchInput.OnChanged = func(content string) {
		if content == "" {
			return
		}
		// 搜索列表数据
		list = ui.Services.SearchPasswordData(content)
	}
	clearBtn := widget.NewButton("清空", func() {})
	clearBtn.Icon = theme.ContentClearIcon()
	clearBtn.OnTapped = func() {
		// 清空输入框
		searchInput.SetText("")
	}
	//搜索
	searchBtn := widget.NewButton("", func() {})
	searchBtn.Icon = theme.SearchIcon()
	searchBtn.OnTapped = func() {
		if searchInput.Text == "" {
			return
		}
		// 延时1秒
		time.Sleep(1 * time.Second)
		// 搜索列表数据
		list = ui.Services.SearchPasswordData(searchInput.Text)
	}

	// 定义表头
	headers := []string{"名称", "用户名", "密码", "描述", "状态", "操作"}

	var t *widget.Table

	t = widget.NewTableWithHeaders(
		func() (int, int) {
			// 返回行数 和 列数
			return len(list), len(headers)
		},
		func() fyne.CanvasObject {
			// 创建一个新的单元格对象
			// 所有单元格默认创建空容器，实际内容在UpdateCell中处理
			return container.NewHBox()
		},
		func(id widget.TableCellID, cell fyne.CanvasObject) {
			container := cell.(*fyne.Container)
			// 清空容器原有内容
			container.Objects = nil
			if id.Col == -1 {
				// 隐藏行号列
				return
			}

			if id.Col == len(headers)-1 {
				// 最后一列(操作列)
				// 表头单元格
				// 添加操作按钮

				//查看详情
				searchTableUI.DetailsBtn = widget.NewButton("详情", func() {

					content := ui.Services.FormatDetails(list[id.Row])
					// 显示详情
					showDetailsWindow(content)
				})
				// 复制
				searchTableUI.CopyBtn = widget.NewButton("", func() {

					content := ui.Services.FormatDetails(list[id.Row])
					// 复制到剪贴板
					utils.CopyText(content)
					// 显示提示（可选）
					showCopyNotification(content)
				})
				searchTableUI.CopyBtn.Icon = theme.ContentCopyIcon()

				searchTableUI.EditBtn = widget.NewButton("编辑", func() {})

				searchTableUI.EditBtn.OnTapped = windows.ShowEditWindow(list[id.Row], func() {
					// 搜索列表数据
					list = ui.Services.SearchPasswordData(searchInput.Text)
					t.Refresh()
				})

				container.Add(searchTableUI.DetailsBtn)
				container.Add(searchTableUI.CopyBtn)
				container.Add(searchTableUI.EditBtn)

			} else {

				// 数据列
				// 根据列索引显示不同数据
				label := widget.NewLabel("")
				row := list[id.Row]
				switch id.Col {
				case 0:
					label.SetText(utils.Substring(row.Name, 0, 6))
				case 1:
					// label.SetText(fmt.Sprintf("%d", row.Age))
					label.SetText(utils.Substring(row.Username, 0, 6))
				case 2:
					label.SetText(utils.Substring(row.Password, 0, 6))
				case 3:
					label.SetText(utils.Substring(row.Desc, 0, 6))
				case 4:
					// label.SetText(fmt.Sprintf("%d", row.Status))
					if row.Status == 0 {
						label.SetText("正常")
					}
				}
				container.Add(label)
			}
		},
	)
	// SearchTableUI.TableRef = t // 保存引用
	// 设置表头
	t.UpdateHeader = func(id widget.TableCellID, template fyne.CanvasObject) {
		// fmt.Println(id.Col)
		if id.Col == -1 {
			if label, ok := template.(*widget.Label); ok {
				label.SetText("")
			}
			return // 完全跳过行号列
		}
		if id.Col < 0 || id.Col >= len(headers) {
			return
		}
		if label, ok := template.(*widget.Label); ok {
			label.SetText(headers[id.Col])
		}
	}
	// 添加点击复制功能
	t.OnSelected = func(id widget.TableCellID) {
		if id.Row == -1 { // 忽略表头点击
			return
		}
		// 获取单元格内容
		var content string
		row := list[id.Row]
		switch id.Col {
		case 0:
			content = row.Name
		case 1:
			content = row.Username
		case 2:
			content = row.Password
		case 3:
			content = row.Desc
		case 4:
			content = fmt.Sprintf("%d", row.Status)
		}

		// 复制到剪贴板
		utils.CopyText(content) // 调用复制函数

		// 显示提示（可选）
		showCopyNotification(content)
	}

	// 隐藏行号列
	t.SetColumnWidth(-1, 0) // 将序号列宽度设为0
	// 设置其他列宽
	for i := 0; i < len(headers); i++ {
		if i == len(headers)-1 {
			// 操作列宽度
			t.SetColumnWidth(i, 145)
		} else if i == len(headers)-2 {
			t.SetColumnWidth(i, 70)
		} else if i == 0 {
			t.SetColumnWidth(i, 130)
		} else {
			t.SetColumnWidth(i, 105)
		}
	}

	// 设置行高
	/* t.SetRowHeight(2, 30) // 所有行高设为30像素 */
	t.Refresh() // 必须调用Refresh更新显示

	funcUiLayout := container.NewHBox(clearBtn, searchBtn)
	searchLayout := container.NewBorder(searchInput, funcUiLayout, nil, nil, nil)

	w.SetContent(container.NewBorder(searchLayout, nil, nil, nil, t))

	// start 监听主窗口的关闭事件
	// 前提是必须设置主窗口
	w.SetOnClosed(func() {
		w.Close()
	})
	// edn 监听主窗口的关闭事件

	// 设置窗口大小,
	w.Resize(fyne.NewSize(700, 420))
	w.CenterOnScreen()
	w.Show()

}
